﻿namespace MiniCore;

/// <summary>
/// 传输层的服务器负责请求的监听、接收和最终的响应，当它接收到客户端发送的请求后，需要将它分发给后续中间件进行处理。对于某个中间件来说，当我们完成了自身的请求处理任务之后，在大部分情况下也需要
/// 将请求分发给后续的中间件。请求在服务器与中间件之间，以及在中间件之间的分发是通过共享上下文的方式实现的。
/// 服务器接收到请求之后，会创建一个通过HttpContext表示的上下文对象，所有中间件都是在这个上下文中处理请求的，那么一个HttpContext对象究竟携带怎样的上下文信息呢？我们知道一个HTTP事务
/// （Transaction）具有非常清晰的界定，即接收请求、发送响应，所以请求和响应是两个基本的要素，也是HttpContext承载的最核心的上下文信息。
/// </summary>
public class HttpContext
{
    public HttpRequest Request { get; }

    public HttpResponse Response { get; set; }

    public HttpContext(IFeatureCollection features)
    {
        Request = new HttpRequest(features);
        Response = new HttpResponse(features);
    }
}

/// <summary>
/// 理解为输入，利用HttpContext得到当前请求所有的输入信息
/// </summary>
public class HttpRequest
{
    private readonly IHttpRequestFeature _feature;
    /// <summary>
    /// 请求地址
    /// </summary>
    public Uri Url => _feature.Url;

    /// <summary>
    /// 请求头集合
    /// </summary>
    public NameValueCollection Headers => _feature.Headers;

    /// <summary>
    /// 请求主体
    /// </summary>
    public Stream Body => _feature.Body;

    public HttpRequest(IFeatureCollection features) => _feature = features.Get<IHttpRequestFeature>();
}

/// <summary>
/// 理解为输出，利用HttpContext完成我们所需的所有输出工作
/// </summary>
public class HttpResponse
{
    private readonly IHttpResponseFeature _feature;

    /// <summary>
    /// 响应头集合
    /// </summary>
    public NameValueCollection Headers => _feature.Headers;

    /// <summary>
    /// 响应主题
    /// </summary>
    public Stream Body => _feature.Body;

    /// <summary>
    /// 响应状态码
    /// </summary>
    public int StatusCode
    {
        get => _feature.StatusCode;
        set => _feature.StatusCode = value;
    }
    public HttpResponse(IFeatureCollection features) => _feature = features.Get<IHttpResponseFeature>();

}